Observer(观察者)
什么是Observer? Observer(观察者)是Observable(可观察对象)推送数据的消费者。在RxJS中,Observer是一个由回调函数组成的对象,键名分别为next
、error
和 complete
,以此接受Observable推送的不同类型的通知,下面的代码段是Observer的一个示例:
var observer = {
next: x => console.log('Observer got a next value: ' + x),
error: err => console.error('Observer got an error: ' + err),
complete: () => console.log('Observer got a complete notification'),
};
调用Observer逻辑,只需在subscribe
(订阅)Observable后将Observer传入:
observable.subscribe(observer);
在RxJS中,Observer是可选的。在next
、error
和 complete
处理逻辑部分缺失的情况下,Observable仍然能正常运行,为包含的特定通知类型的处理逻辑会被自动忽略。
下面例子中Observer并不包含complete
类型通知的处理逻辑:
var observer = {
next: x => console.log('Observer got a next value: ' + x),
error: err => console.error('Observer got an error: ' + err),
};
在订阅Observable时,你甚至可以把回调函数作为参数传入,而不是传入完整的Observer对象:
observable.subscribe(x => console.log('Observer got a next value: ' + x));
在RxJS内部,调用observable.subscribe
时,它会创建一个只有next
处理逻辑的Observer。当然你也可以将next
、error
和 complete
的回调函数分别传入:
observable.subscribe(
x => console.log('Observer got a next value: ' + x),
err => console.error('Observer got an error: ' + err),
() => console.log('Observer got a complete notification')
);
Subscription
什么是Subscription? Subscription是一个代表可以终止资源的对象,表示一个Observable的执行过程。Subscription有一个重要的方法:unsubscribe
。这个方法不需要传入参数,调用后便会终止相应的资源。在RxJS以前的版本中,Subscription被称为"Disposable"。
var observable = Rx.Observable.interval(1000);
var subscription = observable.subscribe(x => console.log(x));
subscription.unsubscribe();
Subscription能够通过unsubscribe()
函数终止Observable的执行过程并释放相应资源。
Subscription可以嵌套使用:你可以调用一个Subscription的unsubscribe()
方法来取消一系列嵌套的Subscription。通过add
方法,便可以实现Subscription的嵌套:
var observable1 = Rx.Observable.interval(400);
var observable2 = Rx.Observable.interval(300);
var subscription = observable1.subscribe(x => console.log('first: ' + x));
var childSubscription = observable2.subscribe(x => console.log('second: ' + x));
subscription.add(childSubscription);
setTimeout(() => {
// 终止所有嵌套的Subscription
subscription.unsubscribe();
}, 1000);
执行后,控制台会输出一下结果:
second: 0
first: 0
second: 1
first: 1
second: 2
此外,Subscription提供了remove(otherSubscription)
方法,可以删除一个Subscription嵌套的子Subscription。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。